package Day_0131.JVM;

/**
 * @author zxc
 * @date 2023/01/31 15:40
 **/
public class Object_Method {
    public static void main(String[] args) {
        /**
         * Object类（java.lang.Object）的常用方法 ：
         * 1.clone 方法（权限 ：protected）
         * （1）实现对象的浅复制，只有实现了 Cloneable 接口才可以调用该方法，否则抛出CloneNotSupportedException 异常，
         * （2）深拷贝也需要实现 Cloneable，同时其成员变量为引用类型的也需要实现 Cloneable，然后重写 clone 方法。
         *
         * 2.finalize 方法
         * 该方法和垃圾收集器有关系，判断一个对象是否可以被回收的最后一步就是判断是否重写了此方法。
         *
         * 3.equals 方法
         * 一般 equals 和 == 是不一样的，但是在 Object 中两者是一样的。
         * （==，所比较的是对象地址;equals，所比较的是对象内容;）
         * 子类一般都要重写这个方法。
         *
         * 4.hashCode 方法
         * （即，每个对象在堆内存中对象地址都会有属于其专属的hashcode值;）
         * 该方法用于哈希查找，重写了 equals 方法一般都要重写 hashCode 方法，
         * 这个方法在一些具有哈希功能的 Collection 中用到。
         *
         *  obj1.equals(obj2)==true （即，若是两个对象equals相等的话，则两个对象的hashcode必然是相等的;）
         *  ===> obj1.hashCode()==obj2.hashCode() ，但是hashCode 相等不一定就满足 equals。
         * 不过为了提高效率，应该尽量使上面两个条件接近等价。
         * JDK 1.6、1.7 默认是返回随机数；
         * JDK 1.8 默认是通过和当前线程有关的一个随机数 + 三个确定值，运用随机数算法得到的一个随机数。
         *
         * 5.wait 方法
         * （1）配合synchronized关键字使用，wait方法就是使当前线程等待该对象的锁，当前线程必须是该对象的拥有者，也就是具有该对象的锁。
         * （2）wait() 方法一直等待，直到获得锁或者被中断。
         *
         * 6.wait(long timeout)设定一个超时间隔，如果在规定时间内没有获得锁就返回。
         * 调用该方法后当前线程进入睡眠状态，直到以下事件发生。
         * 1. 其他线程调用了该对象的 notify 方法；
         * 2. 其他线程调用了该对象的 notifyAll 方法；
         * 3. 其他线程调用了 interrupt 中断该线程；
         * 4. 时间间隔到了。
         * 此时该线程就可以被调度了，如果是被中断的话就抛出一个 InterruptedException 异常。
         *
         * 7.notify 方法
         * 配合 synchronized 使用，该方法唤醒在该对象上等待队列中的某个线程
         *（同步队列中的线程是给抢占 CPU 的线程，等待队列中的线程指的是等待唤醒的线程）。
         *
         * 8.notifyAll 方法
         * 配合 synchronized 使用，该方法唤醒在该对象上等待队列中的所有线程;
         *
         * 总结 ：
         * ===》 Object 是所有类的根，是所有类的父类，所有对象包括数组都实现了 Object 的方法。
         */

        /**
         * 获取一个类Class对象的方式
         * （1）对象.getClass();
         * ===> 可以获取当前对象所对应类的Class对象;
         * （2）类名.class;
         * ===> 即，根据类名来获取对应的Class对象;
         * （3）Class.ForName("类路径")
         * ===> 即，根据类路径来获取对应的Class对象;
         */
    }
}
